#include<bits/stdc++.h>
#define db double
using namespace std;
const int N=2e6+5;
int n;
pair<db,db> calc(db h,db r,db R,db H) {
    db lH=H-h;
    db a=(H-lH)/(R-r);
    db b=H-a*R;
    return {a,b};
}
db Val(db a,db b,db p) {return a*p+b;}
struct Node {db h,r,R,H;}stk[N];
int tail,add=0;
db ans=0;
int sol(Node x,Node y) {
    auto [ay,by]=calc(y.h,y.r,y.R,y.h);
    by=x.H-ay*x.R;
    return ay*x.R+by>=x.H-x.h;
}
int check(Node x,Node y) {
    auto [ax,bx]=calc(x.h,x.r,x.R,x.H);
    auto [ay,by]=calc(y.h,y.r,y.R,y.h);
    if(x.R<=y.r) {
        ans+=x.h;
        return 0;
    }
    int flg=0;
    if(x.H-x.h<=Val(ax,bx,y.r) && Val(ax,bx,y.r)<=x.H) flg=1;
    if(x.H-x.h<=Val(ax,bx,y.R)-y.h && Val(ax,bx,y.R)<=x.H) flg=2;
    if(x.r>=y.r && y.R>=x.R && sol(x,y)) flg=3;
    if(!flg) return 1;
    if(flg==1) {ans=Val(ax,bx,y.r);return 0;}
    if(flg==2) {ans=Val(ax,bx,y.R)-y.h;return 0;}
    if(flg==3) {by=x.H-ay*x.R; ans=ay*y.r+by; return 0;}
}
int main() {
    freopen("wan.in","r",stdin);
    freopen("wan.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        Node now;
        scanf("%lf %lf %lf",&now.h,&now.r,&now.R);
        while(tail && check(stk[tail],now)) tail--;
        now.H=ans+now.h; 
        stk[++tail]=now;
    }
    printf("%.6lf\n",stk[tail].H);
    return 0;
}
/*
2
10 1 2
10 3 4


2
40 10 50
60 20 30
*/